package poker;


import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Calendar;

public class ServerConnection {
	Deelname deelname;
	Speler speler;
	Socket socket;
	ObjectOutputStream out;
	ObjectInputStream in;
	
	long ping = 9999;
	Ping p;
	
	public String ip;
	Spel spel;
	

	ServerConnection(Socket socket) {
		this.socket = socket;
		speler = new Speler("default");
		//System.out.println("ServerConnection("+socket+");");
		try {
			ip=socket.getInetAddress().getHostName();
			socket.setSoTimeout(0);
			
			//ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
			out = new ObjectOutputStream(socket.getOutputStream());
			in = new ObjectInputStream(socket.getInputStream());
			Object gekregen = in.readObject();
			if(gekregen.getClass().getCanonicalName().equals("poker.Speler")){
				//System.out.println("SerCon("+this.hashCode()+"): Ik heb een speler gekregen");
				speler = (Speler)gekregen;
			}else if(gekregen.getClass().getCanonicalName().equals("poker.Spel")){
				//System.out.println("SerCon("+this.hashCode()+"): Ik heb een spel gekregen");
				spel = (Spel)gekregen;
			}else if(gekregen.getClass().getCanonicalName().equals("poker.Deelname")){
				//System.out.println("SerCon("+this.hashCode()+"): Ik heb een deelname gekregen");
				deelname = (Deelname)gekregen;
				speler = deelname.getSpeler();
			}else{
				System.out.println("SerCon("+this.hashCode()+"): Ik weet niet wat ik hiermee moet:" + gekregen.getClass().getCanonicalName());
			}
			
			speler = deelname.getSpeler();
			speler.spelerId = socket.getPort();
			out.writeObject(speler);
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//ping();
	}
	
	public void ping()
	{
		if(p == null)
		{
			p = new Ping();
			p.start();
		} else {
			p.interrupt();
		}
	}
	
	public void up() throws IOException{
		if(spel.sr.zoekDeelname(deelname.speler.spelerId) !=null)
		{
			deelname = spel.sr.zoekDeelname(deelname.speler.spelerId);
		}
		out.writeObject(spel);
		out.flush();
	}
	
	public void comment(String msg){
		try {
			out.writeObject(msg);
		} catch (IOException e) {}
	}
	
	public void down(){
		try {
			spel = (Spel)in.readObject();
		}
		catch (IOException e) {} 
		catch (ClassNotFoundException e) {}
		deelname = spel.sr.zoekDeelname(deelname.speler.spelerId);
	}
	
	public void reset()
	{
		try {
			out.reset();
		}
		catch(IOException e) {}
	}
	
	public String toString()
	{
		return "ServerConnection(speler: " + speler.getNaam() + ", ip: " + ip+ ")"; 
	}
	
	public class Ping extends Thread
	{
		boolean running = false;
		
		public void kill()
		{
			running = false;
		}
		public void run()
		{
			running = true;
			while(running)
			{
				//System.out.println("ServerConnection: ping()");
				long milli = Calendar.getInstance().getTimeInMillis();
				try {
					out.writeObject("Ping");
					Object gekregen = null;
					while(true)
					{
						try {
							gekregen = in.readObject();
							if(gekregen.getClass().getCanonicalName().equals("java.lang.String")){
								if(gekregen.equals("Pong!"))
								{
									ping = Calendar.getInstance().getTimeInMillis() - milli;
									break;
								}
							}else{
								//System.out.println("SerCon: Ping: ik weet niet wat ik hier mee moet: "+gekregen);
							}
						} catch (ClassNotFoundException e) {}
					}
				} catch (IOException e) {}
				try {
					Thread.sleep(5000);
				}
				catch(InterruptedException e) {}
			}
		}
	}
}
